/*
 * @Author: zhl
 * @Date: 2021-09-01 14:15:43
 * @LastEditTime: 2021-09-27 15:41:34
 * @LastEditors: zhl
 * @Description: In User Settings Edit
 * @FilePath: \Test\include\DLT698_Frame.h
 */
#ifndef __DLT698_FRAME_H__
#define __DLT698_FRAME_H__

#include <stdint.h>
#include <string.h>
#include <strings.h>
#include <utility>

#include "APDU.h"

/*----------------------------------------------*/
/*帧相关 开始*/
typedef enum _TRANSMIT_INITIATE_DIRECTION{
    C_TO_S_REQUEST    = 0,
    C_TO_S_RESPONSE   = 1,
    S_TO_C_REQUEST    = 2,
    S_TO_C_RESPONSE   = 3
}TRANSMIT_INITIATE_DIRECTION;

typedef enum _DLT698_FRAME_SA_TYPE{
    SA_TYPE_ONE_ADDRESS       = 0,
    SA_TYPE_WILDCARD_ADDRESS  = 1,
    SA_TYPE_GROUP_ADDRESS     = 2,
    SA_TYPE_BROADCAST_ADDRESS = 3
}DLT698_FRAME_SA_TYPE;

typedef struct _CONTROL_CODE_FIELDS{
    unsigned char func_code:3;   //功能码
    unsigned char        sc:1;   //扰码标志
    unsigned char   reserve:1;   //保留
    unsigned char sub_frame:1;   //分帧标志
    unsigned char       prm:1;   //启动标志
    unsigned char       dir:1;   //传输方向
}CONTROL_CODE_FIELDS;

typedef union _CONTROL_CODE{
    CONTROL_CODE_FIELDS control_code;
    unsigned char value;
}CONTROL_CODE;

typedef struct _SERVER_ADDR_FEATURE_FIELDS{
    unsigned char  addr_len:4;    //地址长度
    unsigned char        la:2;    //逻辑地址
    unsigned char addr_type:2;    //地址类型
}SERVER_ADDR_FEATURE_FIELDS;

typedef union _SERVER_ADDR_FEATURE{
    SERVER_ADDR_FEATURE_FIELDS sa_fc;
    unsigned char value;
}SERVER_ADDR_FEATURE;

typedef struct _DLT698_FRAME{
    //前导码
    uint8_t  lc[4] = {0xFE, 0xFE, 0xFE, 0xFE};
    //扰码
    uint8_t  sbc;
    //帧起始码
    uint8_t  sc;
    //除起始字符、结束字符外的长度
    uint16_t l;
    //控制码
    CONTROL_CODE  c;
    //地址域SA的第一个字节特征码
    SERVER_ADDR_FEATURE  sa_fc;
    //地址域SA
    uint8_t  sa[16];
    //客户机地址域CA
    uint8_t  ca;
    //帧头校验码
    uint16_t hcs;
    //用户数据
    APDU apdu;
    // int      apdu_len;
    // uint8_t  *apdu;
    //帧校验码
    uint16_t fcs;
    //帧结束符
    uint8_t  em;

    _DLT698_FRAME(){
        //前导码
        memset(lc, 0xFE, sizeof(lc));
        //扰码
        sbc = 0x33;
        //帧起始码
        sc = 0x68;
        //除起始字符、结束字符外的长度
        l = 0;
        //控制码
        c.value = 0x43;
        //地址域SA的第一个字节特征码
        sa_fc.sa_fc.la = 0x00;
        sa_fc.sa_fc.addr_type = 0x00;
        sa_fc.sa_fc.addr_len = 0x05;
        //地址域SA
        memset(sa, 0, sizeof(sa));
        //地址域CA
        ca = 0x00;
        //帧头校验码
        hcs = 0x00;
        //用户数据
        APDU apdu;
        // apdu_len = 0;
        // apdu = NULL;
        //帧校验码
        fcs = 0x00;
        //帧结束符
        em = 0x16;
    }
    _DLT698_FRAME& operator=(_DLT698_FRAME& data){
        if(this != &data){
            memcpy(lc, data.lc, sizeof(data.lc));
            sbc = data.sbc;
            sc = data.sc;
            l = data.l;
            c.value = data.c.value;
            sa_fc.sa_fc.la = data.sa_fc.sa_fc.la;
            sa_fc.sa_fc.addr_type = data.sa_fc.sa_fc.addr_type;
            sa_fc.sa_fc.addr_len = data.sa_fc.sa_fc.addr_len;
            memcpy(sa, data.sa, sizeof(sa));
            ca = data.ca;
            hcs = data.hcs;
            apdu = data.apdu;
            fcs = data.fcs;
            em = data.em;
        }
        return *this;
    }
}DLT698_FRAME;

// typedef struct _DLT698_FRAME_C{
//     //传输与发起的方向
//     TRANSMIT_INITIATE_DIRECTION direction;
//     //分帧标志
//     int sub_frame_flag;
//     //扰码标志
//     int sc_flag;
//     //功能码
//     int func_code;

// }DLT698_FRAME_C;


// typedef struct _PIID_ACD_FIELDS{
//     unsigned char       sn:6;
//     unsigned char      acd:1;
//     unsigned char priority:1;
// }PIID_ACD_FIELDS;


// typedef union _PIID_ACD{
//     PIID_ACD_FIELDS fields;
//     unsigned char value;
// }PIID_ACD;

typedef struct _SEPARATE_FRAME_FIELDS{
    unsigned short      sn:12;
    unsigned short reserve:2;
    unsigned short    type:2;
}SEPARATE_FRAME_FIELDS;

typedef union _SEPARATE_FRAME{
    SEPARATE_FRAME_FIELDS sf;
    uint16_t  value;
}SEPARATE_FRAME;

/*帧相关 结束*/
/*----------------------------------------------*/

// /*----------------------------------------------*/
// /*预连接 开始*/

// typedef enum _LINK_REQUEST_TYPE{
//     LINK_REQ_LOGIN     = 0,      //登录
//     LINK_REQ_HEARTBEAT = 1,      //心跳
//     LINK_REQ_LOGOUT    = 2       //退出登录
// }LINK_REQUEST_TYPE;

// typedef struct _LINK_RESPONSE_RESULT_FIELDS{
//     unsigned char        result:3;     //0：成功， 1：地址重复， 2：非法设备， 3：容量不足，其它值：保留
//     unsigned char      reserve3:1;
//     unsigned char      reserve4:1;
//     unsigned char      reserve5:1;
//     unsigned char      reserve6:1;
//     unsigned char       trusted:1;    //0：不可信， 1：可信。
// }LINK_RESPONSE_RESULT_FIELDS;

// typedef union _LINK_RESPONSE_RESULT{
//     LINK_RESPONSE_RESULT_FIELDS  fields;
//     uint8_t value;
// }LINK_RESPONSE_RESULT;

// typedef struct _LINK_REQUEST_FRAME{
//     PIID_ACD          piid;               //服务序号-优先级-ACD
//     LINK_REQUEST_TYPE type;               //请求类型
//     uint16_t          heartbeat_interval; //心跳周期
//     unsigned char     req_datetime[10];   //请求时间
// }LINK_REQUEST_FRAME;

// typedef struct _LINK_RESPONSE_FRAME{
//     PIID       piid;                //服务序号-优先级
//     LINK_RESPONSE_RESULT result;    //结果
//     unsigned char req_datetime[10]; //请求时间请求时间
//     unsigned char rcv_datetime[10]; //收到时间
//     unsigned char rsp_datetime[10]; //响应时间
// }LINK_RESPONSE_FRAM;

// /*预连接 结束*/
// /*----------------------------------------------*/


// /*----------------------------------------------*/
// /*建立应用连接 开始*/
// typedef enum _CONNECT_MECHANISM_INFO_TYPE{
//     CONNECT_MECHANISM_NULL_SECURITY      = 0, //公共连接 [0] NullSecurity，
//     CONNECT_MECHANISM_PWD_SECURITY       = 1, //一般密码 [1] PasswordSecurity，
//     CONNECT_MECHANISM_SYMMETRY_SECURITY  = 2, //对称加密 [2] SymmetrySecurity，
//     CONNECT_MECHANISM_SIGNATURE_SECURITY = 3, //数字签名 [3] SignatureSecurity
// }CONNECT_MECHANISM_INFO_TYPE;

// typedef struct _CONNECT_MECHANISM_INFO{
//     CONNECT_MECHANISM_INFO_TYPE  tag; 
//     uint8_t cipher[2048];                   //密文，tag为一般密码时，此处存放密码
//     uint8_t signature[2048];                //客户机签名
//     _CONNECT_MECHANISM_INFO(){
//         tag = CONNECT_MECHANISM_NULL_SECURITY;
//         bzero(cipher, sizeof(cipher));
//         bzero(signature, sizeof(signature));
//     }
// }CONNECT_MECHANISM_INFO;

// typedef struct _PROTOCOL_CONFORMANCE_FIELDS{
//     uint8_t       app_association:1;  //应用连接协商 Application Association （0），
//     uint8_t            get_normal:1;  //请求对象属性 Get Normal （1），
//     uint8_t         get_with_list:1;  //批量请求基本对象属性 Get With List （2），
//     uint8_t            get_record:1;  //请求记录型对象属性 Get Record （3），
//     uint8_t             get_proxy:1;  //代理请求对象属性 Get Proxy （4），
//     uint8_t      get_proxy_record:1;  //代理请求记录型对象属性 Get Proxy Record （5），
//     uint8_t   get_subsequent_rame:1;  //请求分帧后续帧 Get Subsequent Frame （6），
//     uint8_t            set_normal:1;  //设置基本对象属性 Set Normal （7），
//     uint8_t         set_with_list:1;  //批量设置基本对象属性 Set With List （8），
//     uint8_t          set_with_get:1;  //设置后读取 Set With Get （9），
//     uint8_t             set_proxy:1;  //代理设置对象属性 Set Proxy （10），
//     uint8_t    set_proxy_with_get:1;  //代理设置后读取对象属性 Set Proxy With Get （11），
//     uint8_t         action_normal:1;  //执行对象方法 Action Normal （12），
//     uint8_t      action_with_list:1;  //批量执行对象方法 Action With List （13），
//     uint8_t action_read_with_list:1;  //执行方法后读取 Action With List （14），
//     uint8_t          action_proxy:1;  //代理执行对象方法 Action Proxy （15），
//     uint8_t action_proxy_with_get:1;  //代理执行后读取 Action Proxy With Get （16），
//     uint8_t   active_event_report:1;  //事件主动上报 Active Event Report （17），
//     uint8_t         follow_report:1;  //事件尾随上报 （18)，
//     uint8_t        action_req_acd:1;  //事件请求访问位 ACD 上报 （19)，
//     uint8_t             sub_frame:1;  //分帧数据传输 （20），
//     uint8_t              reserve1:3;  //保留
//     uint8_t              reserve2:7;  //保留
//     uint8_t security_transmission:1;  //安全方式传输 （31），
//     uint8_t              ID0_READ:1;  //对象属性 ID 为 0 的读取访问 （32），
//     uint8_t             ID0_VISIT:1;  //对象属性 ID 为 0 的设置访问 （33）
//     uint8_t              reserve3:6;  //保留
//     uint8_t              reserve4:8;  //保留
//     uint8_t              reserve5:8;  //保留
//     uint8_t              reserve6:8;  //保留
//     _PROTOCOL_CONFORMANCE_FIELDS(){
//         app_association = 1;
//         get_normal = 1;
//         get_with_list = 1;
//         get_record = 1;
//         get_proxy = 1;
//         get_proxy_record = 1;
//         get_subsequent_rame = 1;
//         set_normal = 1;
//         set_with_list = 1;
//         set_with_get = 1;
//         set_proxy = 1;
//         set_proxy_with_get = 1;
//         action_normal = 1;
//         action_with_list = 1;
//         action_read_with_list = 1;
//         action_proxy = 1;
//         action_proxy_with_get = 1;
//         active_event_report = 1;
//         follow_report = 1;
//         action_req_acd = 1;
//         sub_frame = 1;
//         reserve1 = 0;
//         reserve2 = 0;
//         security_transmission = 1;
//         ID0_READ = 1;
//         ID0_VISIT = 1;
//         reserve3 = 0;
//         reserve4 = 0;
//         reserve5 = 0;
//         reserve6 = 0;
//     }
// }PROTOCOL_CONFORMANCE_FIELDS;

// typedef union _PROTOCOL_CONFORMANCE{
//     PROTOCOL_CONFORMANCE_FIELDS fields;
//     uint8_t value[8];
//     _PROTOCOL_CONFORMANCE(){
        
//     }
// }PROTOCOL_CONFORMANCE;

// typedef struct _FUNCTION_CONFORMANCE_FIELDS{
//     uint8_t          electric_energy_meter:1; //电能量计量   （0），
//     uint8_t      bidirectional_power_meter:1; //双向有功计量 （1），
//     uint8_t           reactive_power_meter:1; //无功电能计量 （2），
//     uint8_t           apparent_power_meter:1; //视在电能计量 （3），
//     uint8_t                   ctive_demand:1; //有功需量    （4），
//     uint8_t                reactive_demand:1; //无功需量    （5），
//     uint8_t                apparent_demand:1; //视在需量    （6），
//     uint8_t                  multiple_rate:1; //复费率     （7），
//     uint8_t                  valve_control:1; //阀控       （8），
//     uint8_t             local_cost_control:1; //本地费控 （9），
//     uint8_t            remote_cost_control:1; //远程费控 （10），
//     uint8_t    fundamental_electric_energy:1; //基波电能 （11），
//     uint8_t       harmonic_electric_energy:1; //谐波电能 （12），
//     uint8_t               harmonic_content:1; //谐波含量 （13），
//     uint8_t            waveform_distortion:1; //波形失真度 （14），
//     uint8_t  multifunction_terminal_output:1; //多功能端子输出 （15），
//     uint8_t                   event_record:1; //事件记录 （16），
//     uint8_t                   event_report:1; //事件上报 （17），
//     uint8_t        temperature_measurement:1; //温度测量 （18），
//     uint8_t                 status_monitor:1; //状态量监测 （19），
//     uint8_t         communication_ethernet:1; //以太网通信 （20），
//     uint8_t        communication_infra_red:1; //红外通信 （21），
//     uint8_t        communication_bluetooth:1; //蓝牙通信 （22），
//     uint8_t                    multi_media:1; //多媒体采集 （23），
//     uint8_t                        reserve:1; //保留 （24），
//     uint8_t             dc_analog_quantity:1; //直流模拟量 （25），
//     uint8_t         weak_current_interface:1; //弱电端子 12V 输出 （26），
//     uint8_t          search_electric_meter:1; //搜表 （27），
//     uint8_t       three_phase_load_balance:1; //三相负载平衡 （28），
//     uint8_t                         update:1; //升级 （29）
//     uint8_t                       reserve1:2; //保留
//     uint32_t                      reserve2:32; //保留
//     uint32_t                      reserve3:32; //保留
//     uint32_t                      reserve4:32; //保留

//     _FUNCTION_CONFORMANCE_FIELDS(){
//         electric_energy_meter = 1;
//         bidirectional_power_meter = 1;
//         reactive_power_meter = 1;
//         apparent_power_meter = 1;
//         ctive_demand = 1;
//         reactive_demand = 1;
//         apparent_demand = 1;
//         multiple_rate = 1;
//         valve_control = 1;
//         local_cost_control = 1;
//         remote_cost_control = 1;
//         fundamental_electric_energy = 1;
//         harmonic_electric_energy = 1;
//         harmonic_content = 1;
//         waveform_distortion = 1;
//         multifunction_terminal_output = 1;
//         event_record = 1;
//         event_report = 1;
//         temperature_measurement = 1;
//         status_monitor = 1;
//         communication_ethernet = 1;
//         communication_infra_red = 0;
//         communication_bluetooth = 1;
//         multi_media = 0;
//         reserve = 0;
//         dc_analog_quantity = 1;
//         weak_current_interface = 1;
//         search_electric_meter = 1;
//         three_phase_load_balance = 1;
//         update = 1;
//         reserve1 = 0;
//         reserve2 = 0;
//         reserve3 = 0;
//         reserve4 = 0;
//     }
// }FUNCTION_CONFORMANCE_FIELDS;

// typedef union _FUNCTION_CONFORMANCE{
//     FUNCTION_CONFORMANCE_FIELDS fields;
//     uint8_t value[16];
//     _FUNCTION_CONFORMANCE(){
        
//     }
// }FUNCTION_CONFORMANCE;

// typedef struct _CONNECT_REQUEST_FRAME{
//     PIID  piid; //服务序号-优先级 PIID，
//     uint16_t protocol_ver; //期望的协议版本号 long-unsigned，
//     PROTOCOL_CONFORMANCE protocol_conformance; //期望的协议一致性块 ProtocolConformance，
//     FUNCTION_CONFORMANCE function_conformance; //期望的功能一致性块 FunctionConformance，
//     uint16_t frame_max_size; //客户机发送帧最大尺寸 long-unsigned，
//     uint16_t recv_max_size; //客户机接收帧最大尺寸 long-unsigned，
//     uint8_t  recv_max_window_size; //客户机接收帧最大窗口尺寸 unsigned，
//     uint16_t handle_fame_max_size; //客户机最大可处理帧尺寸 long-unsigned，
//     uint32_t expected_timeout; //期望的应用连接超时时间 double-long-unsigned，
//     CONNECT_MECHANISM_INFO connect_mechanism; //认证请求对象 ConnectMechanismInfo
//     _CONNECT_REQUEST_FRAME(){
//         piid.value = 0;
//         protocol_ver = 1;
//         frame_max_size = 16 * 1024;
//         recv_max_size = frame_max_size;
//         recv_max_window_size = 255;
//         handle_fame_max_size = frame_max_size;
//         expected_timeout = 5;
//     }
// }CONNECT_REQUEST_FRAME;

// typedef struct _FACTORY_VERSION{
//     char vendor_code[4];
//     char software_ver[4];
//     char software_release_date[6];
//     char hardware_ver[4];
//     char hardware_release_date[6];
//     char vendor_extend_info[8];
// }FACTORY_VERSION;

// typedef enum _CONNECT_RESULT{
//     CONNECT_RESULT_ALLOW                 = 0,   //允许建立应用连接
//     CONNECT_RESULT_PASSWORD_ERR          = 1,   //密码错误
//     CONNECT_RESULT_SYMMETRIC_CIPHER_ERR  = 2,   //对称解密错误
//     CONNECT_RESULT_ASYMMETRIC_CIPHER_ERR = 3,   //非对称解密错误
//     CONNECT_RESULT_SIGNATURE_ERR         = 4,   //签名错误
//     CONNECT_RESULT_PROTOCOL_MISMATCH     = 5,   //协议版本不匹配
//     CONNECT_RESULT_OTHER_ERR             = 255, //其它错误
// }CONNECT_RESULT;

// typedef struct _SECURITY_DATA{
//     uint8_t      RN[128];
//     uint8_t      signature[128];
// }SECURITY_DATA;

// typedef struct _CONNECT_RESPONSE_INFO{
//     CONNECT_RESULT result;        //认证结果
//     SECURITY_DATA  security_data; //认证附加信息
// }CONNECT_RESPONSE_INFO;

// typedef struct _CONNECT_RESPONSE_FRAME{
//     PIID_ACD  piid; //服务序号-优先级 PIID，
//     FACTORY_VERSION factory;
//     uint16_t protocol_ver; //协商的协议版本号 long-unsigned，
//     PROTOCOL_CONFORMANCE protocol_conformance; //协商的协议一致性块 ProtocolConformance，
//     FUNCTION_CONFORMANCE function_conformance; //协商的功能一致性块 FunctionConformance，
//     uint16_t frame_max_size; //客户机发送帧最大尺寸 long-unsigned，
//     uint16_t recv_max_size; //客户机接收帧最大尺寸 long-unsigned，
//     uint8_t  recv_max_window_size; //客户机接收帧最大窗口尺寸 unsigned，
//     uint16_t handle_fame_max_size; //客户机最大可处理帧尺寸 long-unsigned，
//     uint32_t expected_timeout; //协商的应用连接超时时间 double-long-unsigned，
//     CONNECT_RESPONSE_INFO connect_response; //认证请求对象 ConnectMechanismInfo
// }CONNECT_RESPONSE_FRAME;

// /*建立应用连接 结束*/
// /*----------------------------------------------*/


// /*----------------------------------------------*/
// /*断开应用连接 开始*/


// /*断开应用连接 结束*/
// /*----------------------------------------------*/


// /*----------------------------------------------*/
// /*读取 开始*/


// /*读取 结束*/
// /*----------------------------------------------*/


// /*----------------------------------------------*/
// /*设置 开始*/


// /*设置 结束*/
// /*----------------------------------------------*/


// /*----------------------------------------------*/
// /*上报 开始*/


// /*上报 结束*/
// /*----------------------------------------------*/


// /*----------------------------------------------*/
// /*代理 开始*/


// /*代理 结束*/
// /*----------------------------------------------*/


// /*----------------------------------------------*/
// /*安全传输 开始*/


// /*安全传输 结束*/
// /*----------------------------------------------*/
// typedef uint8_t  APDU_TAG_TYPE;
// typedef uint8_t  APDU_FUNC_TYPE;
// typedef uint8_t  PIID_TYPE;
typedef uint8_t  RESULT_TYPE;
typedef uint8_t  DATA_CODE_TYPE;
typedef uint8_t  DATA_SIZE_TYPE;
// typedef uint8_t  OAD_TYPE[4];
typedef uint8_t  ERROR_CODE_TYPE[4];

// /*数据*/
// /*---------------------------------------------*/
// typedef struct _OAD_TYPE{
//     uint16_t OI;
//     uint8_t  id;
//     uint8_t  index;
// }OAD_TYPE;

// typedef struct _OAD{
//     OAD_TYPE oad;
//     uint8_t  value[4];
// }OAD;

// typedef enum _TIME_UNIT{
//     TIME_UNIT_SECOND = 0,
//     TIME_UNIT_MINUTE = 0,
//     TIME_UNIT_HOUR   = 0,
//     TIME_UNIT_DAY    = 0,
//     TIME_UNIT_MONTH  = 0,
//     TIME_UNIT_YEAR   = 0
// }TIME_UNIT;

// typedef struct _TI{
//     TIME_UNIT unit;
//     uint16_t  interval;
// }TI;

// typedef struct _DATE_TIME_S{
//     uint16_t year;
//     uint8_t  month;
//     uint8_t  day;
//     uint8_t  hour;
//     uint8_t  minute;
//     uint8_t  second;
// }DATE_TIME_S;
// /**
//  * @brief 访问异常码
//  */
// typedef enum _DAR{
//     DATA_ACCESS_RESULT_SUCCESSE  = 0,  //成功
//     DATA_ACCESS_RESULT_HW_FAILED  = 1, //硬件失效
//     DATA_ACCESS_RESULT_TEMP_FAILED  = 2, //暂时失效
//     DATA_ACCESS_RESULT_REFUSE_RW  = 3, //拒绝读写
//     DATA_ACCESS_RESULT_OBJ_UNDEFINED  = 4, //对象未定义
//     DATA_ACCESS_RESULT_OBJ_FUNC_MISMATCH = 5, //对象接口类不符合
//     DATA_ACCESS_RESULT_OBJ_NOT_EXISTS = 6,   //对象不存在
//     DATA_ACCESS_RESULT_TYPE_MISMATCH  = 7,   //类型不匹配
//     DATA_ACCESS_RESULT_OUT_OF_RANGE  = 8, // 越界 （8）
//     DATA_ACCESS_RESULT_DATA_BLOCK_NOT_AVAILABLE  = 9, // 数据块不可用
//     DATA_ACCESS_RESULT_NEXT_FRAME_CANCEL  = 10, // 分帧传输已取消
//     DATA_ACCESS_RESULT_NO_NEXT_FRAME  = 11, // 不处于分帧传输状态
//     DATA_ACCESS_RESULT_WRITE_BLOCK_CANCEL = 12, // 块写取消
//     DATA_ACCESS_RESULT_NO_WRITE_BLOCK  = 13, // 不存在块写状态
//     DATA_ACCESS_RESULT_DATA_BLOCK_INVALID  = 14,// 数据块序号无效
//     DATA_ACCESS_RESULT_UNAUTHORIZED  = 15,  // 密码错/未授权
//     DATA_ACCESS_RESULT_COMM_RATE_MODIFY_DISABLE  = 16, // 通信速率不能更改
//     DATA_ACCESS_RESULT_YEAR_ZONE_EXCEED  = 17, // 年时区数超
//     DATA_ACCESS_RESULT_DAY_PERIOD_EXCEED = 18, // 日时段数超
//     DATA_ACCESS_RESULT_TARIF_EXCEED = 19, // 费率数超
//     DATA_ACCESS_RESULT_SECURITY_AUTH_MISMATCH  = 20, // 安全认证不匹配 
//     DATA_ACCESS_RESULT_REPEAT_RECHARGE = 21, // 重复充值
//     DATA_ACCESS_RESULT_DATA_ESAM_VALIDATION_FAILED  = 22, // ESAM 验证失败
//     DATA_ACCESS_RESULT_SECURITY_AUTH_FAILED  = 23, // 安全认证失败
//     DATA_ACCESS_RESULT_CUSTOMER_ID_MISMATCH  = 24, /// 客户编号不匹配
//     DATA_ACCESS_RESULT_RECHARGE_COUNT_ERROR = 25, // 充值次数错误
//     DATA_ACCESS_RESULT_ELECTRICITY_OUT_HOARDING   = 26, // 购电超囤积
//     DATA_ACCESS_RESULT_ADDR_ERROR  = 27, // 地址异常
//     DATA_ACCESS_RESULT_SYMMETRY_SECURITY_ERROR = 28, // 对称解密错误
//     DATA_ACCESS_RESULT_ASYMMETRY_SECURITY_ERROR = 29, // 非对称解密错误
//     DATA_ACCESS_RESULT_SIGNATURE_SECURITY_ERROR = 30, // 签名错误
//     DATA_ACCESS_RESULT_METER_HANGING = 31, // 电能表挂起
//     DATA_ACCESS_RESULT_TIMESTAMP_INVALID  = 32, // 时间标签无效
//     DATA_ACCESS_RESULT_REQUEST_TIMEOUT  = 33, // 请求超时
//     DATA_ACCESS_RESULT_ESAM_P1P2_ERROR  = 34, // ESAM 的 P1P2 不正确
//     DATA_ACCESS_RESULT_ESAM_LC_ERROR  = 35, // ESAM 的 LC 错误
//     DATA_ACCESS_RESULT_OTHER_ERROR = 255 // 其它
// }DAR;


class DLT698Frame
{
private:
    /* data */
    static DLT698Frame c_frame;
    DLT698_FRAME c_dlt698_frame;

public:
    

public:
    DLT698Frame(/* args */);
    ~DLT698Frame();

    static DLT698Frame& getInstance();

    uint8_t get_piid();
    uint8_t get_piid_acd();
    uint8_t *get_real_data(const uint8_t *frame, int len);

    int  get_frame(const uint8_t *frame, int len, DLT698_FRAME& dlt698Frame);

    uint8_t  get_frame_sc(const uint8_t *frame, int len);
    uint16_t get_frame_l(const uint8_t *frame, int len);
    uint8_t  get_frame_c(const uint8_t *frame, int len);
    uint8_t  get_frame_sa_sc(const uint8_t *frame, int len);
    std::pair<uint8_t, uint8_t*>  get_frame_sa(const uint8_t *frame, int len);
    uint8_t  get_frame_ca(const uint8_t *frame, int len);
    uint16_t get_frame_hcs(const uint8_t *frame, int len);
    // std::pair<uint16_t, uint8_t*> get_apdu(const uint8_t *frame, int len);
    int  get_apdu(const uint8_t *frame, int len, APDU& apdu);
    uint16_t get_frame_fcs(const uint8_t *frame, int len);
    uint8_t  get_frame_em(const uint8_t *frame, int len);
    uint16_t get_apdu_len(const uint8_t *frame, int len);
    
    //获取控制域格式化内容
    TRANSMIT_INITIATE_DIRECTION get_frame_c_direction(const uint8_t c);
    uint8_t get_frame_c_subframe_flag(const uint8_t c);
    uint8_t get_frame_c_mix_code(const uint8_t c);
    uint8_t get_frame_c_func_code(const uint8_t c);
    //获取地址域格式化内容
    DLT698_FRAME_SA_TYPE get_frame_sa_sc_addr_type(const uint8_t sa_sc);
    uint8_t get_frame_sa_sc_logic_addr(const uint8_t sa_sc);
    uint8_t get_frame_sa_sc_addr_len(const uint8_t sa_sc);

    uint8_t get_apdu_type(const uint8_t *frame, int len);
    int  check_hcs(const uint8_t* frame, int len);
    int  check_fcs(const uint8_t* frame, int len);
    const uint8_t* get_frame_lc(const uint8_t *frame, int len);

};


#endif